iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0

今天我們來看 1. Two Sum 這一題

「這題可以用雙重迴圈做出來」兩位很快的做出了解答

class Solution {
    fun twoSum(nums: IntArray, target: Int): IntArray {
        nums.forEachIndexed { i, _ ->
            nums.forEachIndexed { j, _ ->
                if (nums[i] + nums[j] == target && i != j) {
                    return intArrayOf(i, j)
                }
            }
        }
        return intArrayOf()
    }
}

「嗯!這麼快就寫出解答,看得出你們私下也有好好練習寫程式喔!」夏天雖然剛剛病癒,但是看到曉欣和菁菁的進步,還是感到很開心。

「那接著,我來分享一個比較快速的方式,要用到 Hash 這個資料結構」

Hash?」兩人異口同聲的問

「對,菁菁你知道這個結構嗎?」

「之前大學大概有教過,簡單的說就是有一個 Key,透過 Key 去抓值會比迴圈快吧。可是,這跟這個題目有什麼關係呢?」

「咦,如果抓值會比迴圈快的話,那麼是不是就可以不用兩個迴圈?」曉欣雖然沒學過 Hash,但是聽了兩人的討論,也嘗試猜看看怎麼做會更好。

「好像有道理,可是怎麼在第一次迴圈時,就知道該怎麼取值」兩人開始討論怎麼設計演算法。

夏天突然發現到,在生病不在的這段期間,兩人已經從一開始的生疏,到已經可以自動自發討論演算法的程度了。而且兩人也不再每次都需要自己提供解答。

「夏天姐!我們想到一個作法,可是我們不知道怎麼宣告 Hash」曉欣說到

「啊!宣告的話,可以用 hashMapOf<Int, Int>()

「這樣啊,那我們試看看」兩位開始嘗試調整寫法

「成功了!」

class Solution {
    fun twoSum(nums: IntArray, target: Int): IntArray {
        val map = hashMapOf<Int, Int>()
        nums.forEachIndexed { i, _ ->
            if (map.containsKey(target - nums[i])) {
                val tmp = map[target - nums[i]]!!.toInt()
                return intArrayOf(tmp, i)
            }
            map[nums[i]] = i
        }
        return intArrayOf()
    }
}

「看來,暫時因病請假一陣子,也不是全然是件壞事嘛」看到兩位自己解出題目開心的樣子,夏天暗暗想到。

「那這一題呢?」夏天打開 169. Majority Element

「這題好像要用到比較多 Collection 的技巧」曉欣邊翻著《Kotlin Collection全方位解析攻略 : 精通原理及實戰,寫出流暢好維護的程式》 邊和菁菁討論。夏天也從這次經驗中學習,學習著耐心等兩人討論,不直接給兩人答案。

經過幾次的編譯錯誤,和錯誤答案之後,兩人成功的解答出來。而且出乎夏天意外的,還是單一表達式的寫法

class Solution {
    fun majorityElement(nums: IntArray) = nums
        .toList()
        .groupingBy{it}
        .eachCount()
        .map{ it ->
            if(it.value > nums.size / 2){
                it.key
            }
            else{
                null
            }
        }
        .toList()
        .filterNotNull()[0]
}

「你們兩個太厲害了!」夏天開心的說


上一篇
Day 18:輕鬆練習的一天:Kotlin Koans
下一篇
Day 20:不需要提示的兩人:326、342、125
系列文
Kotlin 程式人:Leetcode 意外旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言